/*
 * @Author: szx
 * @Date: 2021-11-23 18:30:00
 * @LastEditTime: 2021-11-23 19:56:57
 * @Description:
 * @FilePath: \leetcode\1-99\91\91.js
 */
/**
 * @param {string} s
 * @return {number}
 */

// var numDecodings = function (s) {
//     if (s[0] == '0') {
//         return 0;
//     }
//     const dp = new Array(s.length + 1).fill(0);
//     dp[0] = 1;
//     dp[1] = 1;
//     for (let i = 1; i < s.length; i++) {
//         if ((s[i] != '0' && s[i - 1] == '1') || (['1', '2', '3', '4', '5', '6'].includes(s[i]) && s[i - 1] == '2')) {
//             dp[i + 1] += dp[i] + dp[i - 1];
//         } else if (s[i] == '0') {
//             if (!['1', '2'].includes(s[i - 1])) {
//                 return 0;
//             } else if (i - 2 >= 0 && (s[i - 2] == '1' || s[i - 2] == '2')) {
//                 dp[i + 1] = dp[i - 1];
//             } else dp[i + 1] = dp[i];
//         } else {
//             dp[i + 1] = dp[i];
//         }
//     }
//     return dp[s.length];
// };

var numDecodings = function (s) {
    const n = s.length;
    // a = f[i-2], b = f[i-1], c = f[i]
    let a = 0,
        b = 1,
        c = 0;
    for (let i = 1; i <= n; ++i) {
        if (b == 0) return 0;
        c = 0;
        if (s[i - 1] !== '0') {
            c += b;
        }
        if (i > 1 && s[i - 2] != '0' && (s[i - 2] - '0') * 10 + (s[i - 1] - '0') <= 26) {
            c += a;
        }
        a = b;
        b = c;
    }
    return c;
};

// var numDecodings = function (s) {
//     if (s[0] == '0') {
//         return 0;
//     }
//     let a = 1,
//         b = 1,
//         c = 0;

//     for (let i = 0; i < s.length; i++) {
//         c = 0;
//         if ((s[i] != '0' && s[i - 1] == '1') || (['1', '2', '3', '4', '5', '6'].includes(s[i]) && s[i - 1] == '2')) {
//             c += b + a;
//         } else if (s[i] == '0') {
//             if (!['1', '2'].includes(s[i - 1])) {
//                 return 0;
//             } else if (i - 2 >= 0 && (s[i - 2] == '1' || s[i - 2] == '2')) {
//                 c = a;
//             } else c = b;
//         } else {
//             c = b;
//         }
//         a = b;
//         b = c;
//     }
//     return c;
// };
// console.log(numDecodings('120'));
// console.log(numDecodings('2611055971756562'));
// 2 6 1 5
// 26 1 5
// 26 15
// 2 6 15
console.log(numDecodings('2611055971756562'));
// console.log(numDecodings('121012102'));
